package main
type Node struct {
	Val int
	Children []*Node
}
func levelOrders(root *Node) [][]int{
	var res [][]int
	if root ==nil{
		return res
	}
	queue :=[]*Node{root}
	for len(queue) !=0{
		n :=len(queue)
		var nodes []int
		for i:=0;i<n;i++{
			node :=queue[0]
			queue =queue[1:]
			nodes =append(nodes,node.Val)
			if node.Children !=nil {
				for _,child :=range node.Children{
					queue =append(queue,child)
				}
			}
		}
		res =append(res,nodes)
	}
	return res
}


func levelOrder(root *Node) [][]int {
	var res [][]int
	if root ==nil {
		return res
	}
	queue :=[]*Node{root}
	for len(queue)>0{
		var nodes []int
		n:=len(queue)
		for i:=0;i<n;i++{
			node :=queue[0]
			queue=queue[1:]
			if node !=nil{
				nodes =append(nodes,node.Val)
			}

			if node.Children !=nil{
				for _,child :=range node.Children{
					queue =append(queue,child)
				}
			}

		}
		if len(nodes)>0{
			res =append(res,nodes)
		}

	}

	return res
}

//func levelOrder(root *Node) [][]int {
//	var res [][]int
//	if root == nil{
//		return res
//	}
//	queue := []*Node{root}
//	for len(queue) != 0{
//		size := len(queue)
//		var curLevel []int
//		for i:=0;i<size;i++{
//			node := queue[0]
//			queue = queue[1:]
//			curLevel = append(curLevel, node.Val)
//			if node.Children != nil{
//				for _, child := range node.Children{
//					queue = append(queue, child)
//				}
//			}
//		}
//		res = append(res, curLevel)
//	}
//	return res
//}

//func levelOrderBottom(root *TreeNode) [][]int {
//	var res [][]int
//	if root ==nil{
//		return res
//	}
//	queue :=[]*TreeNode{root}
//	for len(queue)>0{
//		var nodes []int
//		n:=len(queue)
//		for i:=0;i<n;i++{
//			node :=queue[0]
//			queue =queue[1:]
//			nodes =append(nodes,node.Val)
//			if node.Left !=nil{
//				queue=append(queue,node.Left)
//			}
//			if node.Right !=nil{
//				queue=append(queue,node.Right)
//			}
//		}
//		res =append(res,nodes)
//
//	}
//	for i := 0; i < len(res) / 2; i++ {
//		res[i], res[len(res) - 1 - i] = res[len(res) - 1 - i], res[i]
//	}
//	return res
//}





